package org.leetcode.other;

public class leetcode_Thread {

    static volatile int start = 0;

    static int end = 100;

    static Object lock = new Object();

    public static class Print implements Runnable {

        int index;

        public Print(int index) {
            this.index = index;
        }

        @Override
        public void run() {
            while (start <= end) {
                synchronized (lock) {

                    //使用while不使用if的原因：唤醒后的线程不一定是对应的输出线程，还需要在判断一轮，使用if会直接进行后续的操作
                        while (start%3!=index){
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
//                    if (start % 3 != index) {
//                        try {
//                            lock.wait();
//                        } catch (InterruptedException e) {
//                            throw new RuntimeException(e);
//                        }
//                    }

                    //再次判断的作用：如果已有线程打印了start，并将start设置为100
                    //再唤醒其他的线程后，如果没有这个判断，仍然会将start进行打印。
                    if (start<=end){
                        System.out.println(index + " print -->" + start);
                    }

                    start++;

                    lock.notifyAll();
                }
            }
        }
    }

    public static void main(String[] args) {

        for (int i = 0; i < 3; i++) {
            new Thread(new Print(i)).start();
        }
    }
}
